home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / BORLAND TURBO ASSEMBLER / WAP32.PAK / WAP32.ASM < prev    next >
Assembly Source File  |  1996-01-10  |  9KB  |  336 lines

  1. ;           Copyright (c) 1993 by Borland International, Inc.
  2. ;
  3. ;                   * Borland Turbo Assembler 4.0 *
  4. ;
  5. ;              * Win32 Application Example in Assembly *
  6. ;
  7. ;     This example (WAP32.ASM) will put up a window and beep when the
  8. ;     right mouse button is pressed.  When the left mouse button is
  9. ;     pressed, it will increment the displayed 32-bit counter.
  10. ;
  11. .386
  12. locals
  13. jumps
  14. .model flat,STDCALL
  15. include win32.inc           ; some 32-bit constants and structures
  16.  
  17. L equ <LARGE>
  18.  
  19. ;
  20. ; Define the external functions we will be linking to
  21. ;
  22. extrn            BeginPaint:PROC
  23. extrn            CreateWindowExA:PROC
  24. extrn            DefWindowProcA:PROC
  25. extrn            DispatchMessageA:PROC
  26. extrn            EndPaint:PROC
  27. extrn            ExitProcess:PROC
  28. extrn            FindWindowA:PROC
  29. extrn            GetMessageA:PROC
  30. extrn            GetModuleHandleA:PROC
  31. extrn            GetStockObject:PROC
  32. extrn            InvalidateRect:PROC
  33. extrn            LoadCursorA:PROC
  34. extrn            LoadIconA:PROC
  35. extrn            MessageBeep:PROC
  36. extrn            MessageBoxA:PROC
  37. extrn            PostQuitMessage:PROC
  38. extrn            RegisterClassA:PROC
  39. extrn            ShowWindow:PROC
  40. extrn            SetWindowPos:PROC
  41. extrn            TextOutA:PROC
  42. extrn            TranslateMessage:PROC
  43. extrn            UpdateWindow:PROC
  44.  
  45. ;
  46. ; for Unicode support, Win32 remaps some functions to either the Ansi or
  47. ; Wide char versions.  We will assume Ansi for this example.
  48. ;
  49. CreateWindowEx   equ <CreateWindowExA>
  50. DefWindowProc    equ <DefWindowProcA>
  51. DispatchMessage  equ <DispatchMessageA>
  52. FindWindow       equ <FindWindowA>
  53. GetMessage       equ <GetMessageA>
  54. GetModuleHandle  equ <GetModuleHandleA>
  55. LoadCursor       equ <LoadCursorA>
  56. LoadIcon         equ <LoadIconA>
  57. MessageBox       equ <MessageBoxA>
  58. RegisterClass    equ <RegisterClassA>
  59. TextOut          equ <TextOutA>
  60.  
  61. .data
  62. copyright        db 'Borland C++ - Copyright 1993 Borland International',0
  63.  
  64. newhwnd          dd 0
  65. lppaint          PAINTSTRUCT <?>
  66. msg              MSGSTRUCT   <?>
  67. wc               WNDCLASS    <?>
  68. mbx_count        dd 0
  69.  
  70. hInst            dd 0
  71.  
  72. szTitleName      db 'Win32 Assembly Program'
  73. zero             db 0
  74. szAlternate      db '(Secondary)',0
  75. szClassName      db 'ASMCLASS32',0
  76. szPaint          db 'Left Button pressed:'
  77. s_num            db '00000000h times.',0
  78. MSG_L EQU ($-offset szPaint)-1
  79.  
  80. .code
  81. ;-----------------------------------------------------------------------------
  82. ;
  83. ; This is where control is received from the loader.
  84. ;
  85. start:
  86.  
  87.         push    L 0
  88.         call    GetModuleHandle         ; get hmod (in eax)
  89.         mov     [hInst], eax            ; hInstance is same as HMODULE
  90.                                         ; in the Win32 world
  91.  
  92.         push    L 0
  93.         push    offset szClassName
  94.         call    FindWindow
  95.         or      eax,eax
  96.         jz      reg_class
  97.  
  98.         mov     [zero], ' '             ; space to modify title string
  99.  
  100. reg_class:
  101. ;
  102. ; initialize the WndClass structure
  103. ;
  104.         mov     [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS
  105.         mov     [wc.clsLpfnWndProc], offset WndProc
  106.         mov     [wc.clsCbClsExtra], 0
  107.         mov     [wc.clsCbWndExtra], 0
  108.  
  109.         mov     eax, [hInst]
  110.         mov     [wc.clsHInstance], eax
  111.  
  112.         push    L IDI_APPLICATION
  113.         push    L 0
  114.         call    LoadIcon
  115.         mov     [wc.clsHIcon], eax
  116.  
  117.         push    L IDC_ARROW
  118.         push    L 0
  119.         call    LoadCursor
  120.         mov     [wc.clsHCursor], eax
  121.  
  122.         mov     [wc.clsHbrBackground], COLOR_WINDOW + 1
  123.         mov     dword ptr [wc.clsLpszMenuName], 0
  124.         mov     dword ptr [wc.clsLpszClassName], offset szClassName
  125.  
  126.         push    offset wc
  127.         call    RegisterClass
  128.  
  129.         push    L 0                      ; lpParam
  130.         push    [hInst]                  ; hInstance
  131.         push    L 0                      ; menu
  132.         push    L 0                      ; parent hwnd
  133.         push    L CW_USEDEFAULT          ; height
  134.         push    L CW_USEDEFAULT          ; width
  135.         push    L CW_USEDEFAULT          ; y
  136.         push    L CW_USEDEFAULT          ; x
  137.         push    L WS_OVERLAPPEDWINDOW    ; Style
  138.         push    offset szTitleName       ; Title string
  139.         push    offset szClassName       ; Class name
  140.         push    L 0                      ; extra style
  141.  
  142.         call    CreateWindowEx
  143.  
  144.         mov     [newhwnd], eax
  145.  
  146.         push    L SW_SHOWNORMAL
  147.         push    [newhwnd]
  148.         call    ShowWindow
  149.  
  150.         push    [newhwnd]
  151.         call    UpdateWindow
  152.  
  153. msg_loop:
  154.         push    L 0
  155.         push    L 0
  156.         push    L 0
  157.         push    offset msg
  158.         call    GetMessage
  159.  
  160.         cmp     ax, 0
  161.         je      end_loop
  162.  
  163.         push    offset msg
  164.         call    TranslateMessage
  165.  
  166.         push    offset msg
  167.         call    DispatchMessage
  168.  
  169.         jmp     msg_loop
  170.  
  171. end_loop:
  172.         push    [msg.msWPARAM]
  173.         call    ExitProcess
  174.  
  175.         ; we never get to here
  176.  
  177. ;-----------------------------------------------------------------------------
  178. WndProc          proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
  179. ;
  180. ; WARNING: Win32 requires that EBX, EDI, and ESI be preserved!  We comply
  181. ; with this by listing those regs after the 'uses' statement in the 'proc'
  182. ; line.  This allows the Assembler to save them for us.
  183. ;
  184.         LOCAL   theDC:DWORD
  185.  
  186.         cmp     [wmsg], WM_DESTROY
  187.         je      wmdestroy
  188.         cmp     [wmsg], WM_RBUTTONDOWN
  189.         je      wmrbuttondown
  190.         cmp     [wmsg], WM_SIZE
  191.         je      wmsize
  192.         cmp     [wmsg], WM_CREATE
  193.         je      wmcreate
  194.         cmp     [wmsg], WM_LBUTTONDOWN
  195.         je      wmlbuttondown
  196.         cmp     [wmsg], WM_PAINT
  197.         je      wmpaint
  198.         cmp     [wmsg], WM_GETMINMAXINFO
  199.         je      wmgetminmaxinfo
  200.  
  201.  
  202.         jmp     defwndproc
  203.  
  204. wmpaint:
  205.         push    offset lppaint
  206.         push    [hwnd]
  207.         call    BeginPaint
  208.         mov     [theDC], eax
  209.  
  210.         mov     eax, [mbx_count]
  211.         mov     edi, offset s_num
  212.         call    HexWrite32
  213.  
  214.         push    L MSG_L           ; length of string
  215.         push    offset szPaint    ; string
  216.         push    L 5               ; y
  217.         push    L 5               ; x
  218.         push    [theDC]           ; the DC
  219.         call    TextOut
  220.  
  221.         push    offset lppaint
  222.         push    [hwnd]
  223.         call    EndPaint
  224.  
  225.         mov     eax, 0
  226.         jmp     finish
  227.  
  228. wmcreate:
  229.         mov     eax, 0
  230.         jmp     finish
  231.  
  232. defwndproc:
  233.         push    [lparam]
  234.         push    [wparam]
  235.         push    [wmsg]
  236.         push    [hwnd]
  237.         call    DefWindowProc
  238.         jmp     finish
  239.  
  240. wmdestroy:
  241.         push    L 0
  242.         call    PostQuitMessage
  243.         mov     eax, 0
  244.         jmp     finish
  245.  
  246. wmlbuttondown:
  247.         inc     [mbx_count]
  248.  
  249.         push    L 0
  250.         push    L 0
  251.         push    [hwnd]
  252.         call    InvalidateRect    ; repaint window
  253.  
  254.         mov     eax, 0
  255.         jmp     finish
  256.  
  257. wmrbuttondown:
  258.         push    L 0
  259.         call    MessageBeep
  260.         jmp     finish
  261.  
  262. wmsize:
  263.         mov     eax, 0
  264.         jmp     finish
  265.  
  266. wmgetminmaxinfo:
  267.  
  268.         mov     ebx, [lparam]  ; ptr to minmaxinfo struct
  269.         mov     [(MINMAXINFO ptr ebx).mintrackposition_x] , 350
  270.         mov     [(MINMAXINFO ptr ebx).mintrackposition_y] , 60
  271.         mov     eax, 0
  272.         jmp     finish
  273.  
  274. finish:
  275.         ret
  276. WndProc          endp
  277. ;-----------------------------------------------------------------------------
  278. HexWrite8 proc
  279. ;
  280. ; AL has two hex digits that will be written to ES:EDI in ASCII form
  281. ;
  282.  
  283.         mov     ah, al
  284.         and     al, 0fh
  285.         shr     ah, 4
  286.                                 ; ah has MSD
  287.                                 ; al has LSD
  288.         or      ax, 3030h
  289.         xchg    al, ah
  290.         cmp     ah, 39h
  291.         ja      @@4
  292. @@1:
  293.         cmp     al, 39h
  294.         ja      @@3
  295. @@2:
  296.         stosw
  297.         ret
  298. @@3:
  299.         sub     al, 30h
  300.         add     al, 'A' - 10
  301.         jmp     @@2
  302. @@4:
  303.         sub     ah, 30h
  304.         add     ah, 'A' - 10
  305.         jmp     @@1
  306. HexWrite8 endp
  307. ;-----------------------------------------------------------------------------
  308. HexWrite16 proc
  309. ;
  310. ; AX has four hex digits in it that will be written to ES:EDI
  311. ;
  312.         push    ax
  313.         xchg    al,ah
  314.         call    HexWrite8
  315.         pop     ax
  316.         call    HexWrite8
  317.         ret
  318. HexWrite16 endp
  319. ;-----------------------------------------------------------------------------
  320. HexWrite32 proc
  321. ;
  322. ; EAX has eight hex digits in it that will be written to ES:EDI
  323. ;
  324.         push    eax
  325.         shr     eax, 16
  326.         call    HexWrite16
  327.         pop     eax
  328.         call    HexWrite16
  329.         ret
  330. HexWrite32 endp
  331. ;-----------------------------------------------------------------------------
  332. public WndProc
  333. ends
  334. end start
  335.  
  336.